from typing import Dict, Optional, Set

from .basic import BasicComprehensionPlugin, BasicReaderPlugin, BasicPlugin
from .utils.TestKits import test_comprehension_inference


class MixReaderPlugin(BasicReaderPlugin):
    """
    用于管理Reader插件。
    """
    def __init__(self):
        """
        提供支持多种数据格式的混合Reader。
        """
        super().__init__()
        self.readers: Dict[str, BasicReaderPlugin] = dict()
        self.mainreader: Optional[str] = None  # 主要Reader。

    def search(self, query: str, k: int):
        return self.readers[self.mainreader].search(query, k)

    def readbook(self, bookpath: str):
        return self.readers[self.mainreader].readbook(bookpath)

    def get_readfile_name(self):
        return self.readers[self.mainreader].get_readfile_name()

    def get_introduction(self):
        return ''

    def add(self, filetype: str, reader: BasicReaderPlugin) -> None:
        """
        增加一个新的阅读器。
        :param filetype: 阅读器支持的数据类型。如'.txt'。
        :param reader: 与filetype对应的阅读器。
        :return: None
        """
        assert filetype not in self.readers, "已添加该类型的Reader，不可重复添加"
        self.readers[filetype] = reader

    def delete(self, filetype: str) -> BasicReaderPlugin:
        """
        删除阅读器。
        :param filetype:
        :return: 被删除的阅读器。
        """
        assert filetype in self.readers
        reader = self.readers[filetype]
        del self.readers[filetype]
        return reader

    def support_type(self) -> Set[str]:
        """
        返回当前支持的文件格式。
        :return:
        """
        return set(self.readers.keys())

    def setmainreader(self, filetype: str) -> None:
        """
        设置当前的主要Reader。用于判定在调用方法时调用哪个reader的方法。
        :param filetype:
        :return:
        """
        assert filetype in self.readers, "未配置的类型，请先调用'add'方法。" + self.add.__doc__
        self.mainreader = filetype

    def get_readers(self, type_: str) -> BasicReaderPlugin:
        """
        根据类型获取对用的Reader。
        :param type_:
        :return:
        """
        return self.readers[type_]

    def get_types(self) -> Set[str]:
        """
        返回当前支持的文件类型。
        :return:
        """
        return set(self.readers.keys())
